package service

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/pkg/errors"
	"mojieshi/define"
	"net/http"
	"os"
	"reflect"
	"time"
)

// 单文件上传
func Upload(c *gin.Context) {
	//接收上传的文件
	file, err := c.FormFile("file")
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10000,
			"msg":  err,
		})
		return
	}
	//获取文件后缀
	extstring := Ext(file.Filename)
	fmt.Println(extstring)
	extStrSlice := []string{".xlsx", ".jpg", ".png", ".gif", ".jpeg", ".xls", ".mp4", "mp3"}
	if !ContainArray(extstring, extStrSlice) {
		//fmt.Println("上传失败，文件类型不支持，只能上传 xlsx 格式的。")
		err = errors.New("上传失败，文件类型不支持，只能上传 xlsx,jpg,png,gif 格式的。")
		c.JSON(http.StatusOK, gin.H{
			"code": 10001,
			"msg":  err,
		})
		return
	}
	//从配置文件里取
	now := time.Now().Format("20060102")
	filepath := define.Root + define.FilePath + now

	//如果没有filepath文件目录就创建一个
	if _, err := os.Stat(filepath); err != nil {
		if !os.IsExist(err) {
			os.MkdirAll(filepath, os.ModePerm)
		}
	}
	suiji := define.RandomNum(4) + extstring
	// 文件名格式 自己可以改 建议保证唯一性
	fileName := fmt.Sprintf("%s%s", time.Now().Format("20060102150405"), suiji)
	path := filepath + "/" + fileName                                  //路径+文件名上传
	pathRoot := define.WebUrl + define.FilePath + now + "/" + fileName //保存的路径
	//保存到本地
	err = c.SaveUploadedFile(file, path)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10002,
			"msg":  err,
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"msg":     "上传成功",
		"data": map[string]interface{}{
			"file": pathRoot,
		},
	})
}

// Contain 判断obj是否在target中，target支持的类型array,slice,map   false:不在 true:在
func ContainArray(obj interface{}, target interface{}) bool {
	targetValue := reflect.ValueOf(target)
	switch reflect.TypeOf(target).Kind() {
	case reflect.Slice, reflect.Array:
		for i := 0; i < targetValue.Len(); i++ {
			if targetValue.Index(i).Interface() == obj {
				return true
			}
		}
	case reflect.Map:
		if targetValue.MapIndex(reflect.ValueOf(obj)).IsValid() {
			return true
		}
	}
	return false
}

// 获取文件的扩展名
func Ext(path string) string {
	for i := len(path) - 1; i >= 0 && path[i] != '/'; i-- {
		if path[i] == '.' {
			return path[i:]
		}
	}
	return ""
}
